home *** CD-ROM | disk | FTP | other *** search
/ Aminet 26 / Aminet 26 (1998)(GTI - Schatztruhe)[!][Aug 1998].iso / XiPaint / Developer / Modules / xiport.c < prev    next >
C/C++ Source or Header  |  1995-08-03  |  8KB  |  294 lines

  1. /* Last Change: Mon Feb  7 14:43:04 1994 */
  2.  
  3. /****  Programm zum Testen von User-Messages an den XiUser-Port  ****/
  4.  
  5. /****  System-Includes  ****/
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. #include <exec/exec.h>
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <exec/execbase.h>
  15. #include <exec/ports.h>
  16.  
  17. #include <clib/alib_protos.h>
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21.  
  22.  
  23. /****  benötigte Strukturen und Kommandos  ****/
  24.  
  25. #include "XiUser.h"
  26.  
  27.  
  28. /****  Prototypes der verwendeten Funktionen  ****/
  29.  
  30. int main(int argc, char **argv);
  31.  
  32. void WaitReply(struct MsgPort *ReplyPort, struct Message *WaitMsg);
  33.  
  34.  
  35.  
  36.  
  37.  
  38. /****  Implementation  ****/
  39.  
  40. int main(int argc, char **argv)
  41.   {
  42.     struct MsgPort *XiUserPort, *XiReplyPort;
  43.     struct XiMessage XiMsg;
  44.     char ProjName[100];
  45.     ULONG *PaintMem;
  46.     short i, j, Width, Height;
  47.  
  48. /**  Finden des User-Ports  **/
  49.  
  50.     if ( (XiUserPort = FindPort((UBYTE *)"xiuser.port")) == NULL )
  51.       {
  52.     printf(" User-Port nicht gefunden, läuft XiPaint überhaupt ???\n");
  53.     exit(40);
  54.       }
  55.     printf("xiuser.port gefunden\n");
  56.  
  57. /**  einen Reply-Port einrichten  **/
  58.  
  59.     if ( (XiReplyPort = CreatePort(NULL, 0)) == NULL )
  60.       {
  61.     printf(" Konnte den Reply-Port nicht einrichten !!\n");
  62.     exit(40);
  63.       }
  64.     printf("Replyport errichtet\n");
  65.  
  66. /**  Initialisieren der Message (kann nach Reply wiederverwendet werden)  **/
  67.  
  68.     memset(&XiMsg, 0, sizeof(struct XiMessage));
  69.     
  70.  
  71.     XiMsg.ExecMess.mn_Node.ln_Type = NT_MESSAGE;
  72.     XiMsg.ExecMess.mn_Node.ln_Pri = 0;
  73.     XiMsg.ExecMess.mn_Length = sizeof(struct XiMessage);
  74.     XiMsg.ExecMess.mn_ReplyPort = XiReplyPort;
  75.     XiMsg.Label = 0x12345678;                /* Erkennungsmarke für XiPaint, sehr wichtig !!!! */
  76.  
  77.     printf("xiMsg initialisiert\n");
  78.  
  79.  
  80. /* Test-Msg */
  81.     XiMsg.Command = 99;            /* Kommando ausfüllen */
  82.     printf("Werde jetzt Msg senden\n");
  83.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  84.     printf("Msg gesendet, warte auf Reply\n");
  85.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  86.     printf("Reply erhalten\n");
  87.  
  88.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  89.       {
  90.         printf("OK\n");
  91.       }
  92.     else
  93.       {
  94.     printf("Nicht ok\n");
  95.     exit(0);
  96.       }
  97.  
  98.     printf("\n Taste für weiter...");
  99.     getch();
  100.     printf("\n");
  101.  
  102. /**  erster Test -> holen der Projekt-Liste  **/
  103.  
  104.     XiMsg.Command = XI_GET_PROJECT_LIST;            /* Kommando ausfüllen */
  105.     printf("Werde jetzt Msg senden\n");
  106.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  107.     printf("Msg gesendet, warte auf Reply\n");
  108.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  109.     printf("Reply erhalten\n");
  110.  
  111.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  112.       {
  113.     for(i=0; i<XiMsg.ProjectCount; i++)                /* Auswerten der Liste */
  114.         printf(" Projekt %d:  '%s'\n", i, XiMsg.ProjectList[i]);
  115.  
  116.     strcpy(ProjName, XiMsg.ProjectList[0]);                /* Merken eines Projekts */
  117.  
  118.     /* Achtung: Listenspeicher muß hier freigegeben werden */
  119.     FreeVec(XiMsg.ProjectList);
  120.       }
  121.     else
  122.       {
  123.     printf(" Kein Projekt gefunden -> Ende !!\n");
  124.     exit(0);
  125.       }
  126.  
  127.     printf("\n Taste für weiter...");
  128.     getch();
  129.     printf("\n");
  130.  
  131. /**  Sperren eines Projekts  **/
  132.  
  133.     XiMsg.Command = XI_LOCK_PROJECT;                /* Kommando ausfüllen */
  134.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  135.  
  136.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  137.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  138.  
  139.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  140.       {
  141.     PaintMem = (ULONG *)XiMsg.Memory;                /* Auswerten der Rückgabewerte */
  142.     Width = XiMsg.Width;
  143.     Height = XiMsg.Height;
  144.  
  145.     printf("Projekt '%s' gesperrt,  Größe  %d x %d\n", ProjName, Width, Height);
  146.  
  147.     for(j=20; j<40; j++)                /* Zeichnen eines Lila Rechteckes -> Test */
  148.       {
  149.         for(i=30; i<60; i++)
  150.           {
  151.         *(PaintMem + j * Width + i ) = 0xFF00FF00;
  152.           }
  153.       }
  154.  
  155.     /* nach Manipulation muß noch die Anzeige upgedatet werden */
  156.  
  157.     XiMsg.Command = XI_UPDATE_PROJECT;            /* Kommando ausfüllen */
  158.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  159.  
  160.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  161.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);    /* Warten auf Reply, siehe Fkt. unten, Erfolgscheck nicht notwendig */
  162.       }
  163.     else
  164.       {
  165.     printf(" Konnte Projekt '%s' nicht sperren -> Ende !!\n", ProjName);
  166.     exit(0);
  167.       }
  168.  
  169.     printf("\n Taste für weiter...");
  170.     getch();
  171.     printf("\n");
  172.  
  173. /**  Freigeben des Projekts  **/
  174.  
  175.     XiMsg.Command = XI_UNLOCK_PROJECT;                /* Kommando ausfüllen */
  176.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  177.  
  178.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  179.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  180.  
  181.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich (sollte immer sein...) */
  182.       {
  183.     printf(" Projekt '%s' freigegeben\n", ProjName);
  184.       }
  185.     else
  186.       {
  187.     printf(" Konnte Projekt '%s' nicht freigeben, schwerer Fehler !!\n", ProjName);
  188.     exit(40);
  189.       }
  190.  
  191.     printf("\n Taste für weiter...");
  192.     getch();
  193.     printf("\n");
  194.  
  195. /**  Erzeugen eines neuen Projekts  **/
  196.  
  197.     strcpy(ProjName, "AdPro-Fenster");
  198.  
  199.     XiMsg.Command = XI_NEW_PROJECT;                /* Kommando ausfüllen */
  200.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  201.     XiMsg.Width = 200;                        /* Größe des Projekts */
  202.     XiMsg.Height = 200;
  203.  
  204.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  205.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  206.  
  207.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich */
  208.       {
  209.     PaintMem = (ULONG *)XiMsg.Memory;                /* Auswerten der Rückgabewerte */
  210.     Width = XiMsg.Width;            /* Wichtig: Größe kann sich geändert haben (größer geworden) */
  211.     Height = XiMsg.Height;            /* daher ist ein Übernehem der neuen Größe unbedingt erforderlich !! */
  212.  
  213.     printf("Projekt '%s' erzeugt,  Größe  %d x %d\n", ProjName, Width, Height);
  214.  
  215.     for(j=50; j<150; j++)                /* Zeichnen eines grünen Rechteckes -> Test */
  216.       {
  217.         for(i=50; i<150; i++)
  218.           {
  219.         *(PaintMem + j * Width + i ) = 0x00FF0000;
  220.           }
  221.       }
  222.  
  223.     /* nach Manipulation muß noch die Anzeige upgedatet werden */
  224.  
  225.     XiMsg.Command = XI_UPDATE_PROJECT;            /* Kommando ausfüllen */
  226.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  227.  
  228.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  229.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);    /* Warten auf Reply, siehe Fkt. unten, Erfolgscheck nicht notwendig */
  230.       }
  231.     else
  232.       {
  233.     printf(" Konnte Projekt '%s' nicht erzeugen -> Ende !!\n", ProjName);
  234.     exit(0);
  235.       }
  236.  
  237.     printf("\n Taste für weiter...");
  238.     getch();
  239.     printf("\n");
  240.  
  241. /**  Freigeben des erzeugten Projekts  **/
  242.  
  243.     XiMsg.Command = XI_UNLOCK_PROJECT;                /* Kommando ausfüllen */
  244.     XiMsg.ProjectName = ProjName;                /* Name des Projekts */
  245.  
  246.     PutMsg(XiUserPort, (struct Message *)&XiMsg);        /* Message absenden */
  247.     WaitReply(XiReplyPort, (struct Message *)&XiMsg);        /* Warten auf Reply, siehe Fkt. unten */
  248.  
  249.     if ( XiMsg.Success == TRUE )             /* Aktion war erfolgreich (sollte immer sein...) */
  250.       {
  251.     printf(" Projekt '%s' freigegeben\n", ProjName);
  252.       }
  253.     else
  254.       {
  255.     printf(" Konnte Projekt '%s' nicht freigeben, schwerer Fehler !!\n", ProjName);
  256.     exit(40);
  257.       }
  258.  
  259.     printf("\n Taste für weiter...");
  260.     getch();
  261.     printf("\n");
  262.  
  263. /**  Aufräumen und Ende  **/
  264.  
  265.     DeletePort(XiReplyPort);
  266.     exit(0);
  267.   }
  268.  
  269.  
  270.  
  271. /************
  272.  
  273.   Funktion wartet solange, bis die gesendete Message "WaitMsg" von an den
  274.   Reply-Port zurückgekommen ist
  275.  
  276. ************/
  277.  
  278. void WaitReply(struct MsgPort *ReplyPort, struct Message *WaitMsg)
  279.   {
  280.     struct Message *OkMsg;
  281.     BOOL Loop=TRUE;
  282.  
  283.     while(Loop)
  284.       {
  285.     WaitPort(ReplyPort);
  286.  
  287.     while( OkMsg = GetMsg(ReplyPort) )
  288.       {
  289.         if ( OkMsg == WaitMsg )
  290.             Loop = FALSE;
  291.       }
  292.       }
  293.   }
  294.